/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.ControleFramePrincipal;
import controle.gui.frames.internos.superclasses.Controle;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.EnabledGUIElements;
import controle.gui.utils.setEnabledGUIElements;
import controle.interfaces.Constantes;
import gui.frames.FramePrincipal;
import gui.frames.internos.IFBusca;
import gui.frames.internos.IFQuadras;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelo.*;
import persistencia.dao.AbstractDAO;
import persistencia.dao.TransacaoDAO;

/**
 *
 * @author Maycon Fernando Silva Brito
 * @author mayconfsbrito@gmail.com
 */
public class ControleQuadras extends Controle {

    //Variáveis da classe
    private IFQuadras frame = null;
    public TreeSet<Logradouro> setLogradouros = new TreeSet<Logradouro>();
    public Integer MAX_LOGRADOUROS = 6;

    //Construtor da classe
    public ControleQuadras(IFQuadras frame) {
        super(frame);
        this.frame = frame;
    }

    /**
     * Inicializa o frame
     */
    public void inicializa() {

        //Torna o frame visível
        frame.setVisible(true);

        this.limparGUI();

        //Inicializa eventos da tabela
        frame.tabela.getSelectionModel().addListSelectionListener(frame.listener);
        frame.tabela.getColumnModel().getSelectionModel().addListSelectionListener(frame.listener);

    }

    /**
     * Especificações em @InternalFrame
     */
    public void guiAtiva(boolean estado) {
        if (estado) {
            setEnabledGUIElements.enabledJComponent(frame.buttonCadastro);
            setEnabledGUIElements.disabledJComponent(frame.buttonAlterar);

        } else {
            setEnabledGUIElements.enabledJComponent(frame.buttonAlterar);
            setEnabledGUIElements.disabledJComponent(frame.buttonCadastro);
        }
    }

    /**
     * Verifica o acesso do usuário para utilizar o frame
     */
    protected void verificaAcessos() {

        //Verifica a permissao de @user para este frame
        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CADASTRA_ALTERA_LOCAIS).isAcesso()) {
            EnabledGUIElements.disabledJComponent(frame.buttonCadastro, frame.buttonAlterar);
        }
    }

    /**
     * Limpa os componentes do frame
     */
    public void limparGUI() {

        frame.tabela.clearSelection();
        new ApagaElementosDaInterface().apagaJTextField(frame.textId, frame.textCodigo, frame.textCodigoLocalidade,
                frame.textCodigoMunicipio, frame.textNomeMunicipio, frame.textNomeLocalidade);
        EnabledGUIElements.disabledJComponent(frame.textNomeLocalidade, frame.textCodigoLocalidade, frame.buttonRemover);
        EnabledGUIElements.enabledJComponent(frame.buttonInserir);

        this.setLogradouros = new TreeSet<Logradouro>();
        this.setTabelaLogradouros();

        //Configura o comportamento da gui de acordo com as permissões do usuário
        this.guiAtiva(true);
        this.verificaAcessos();
    }

    /**
     * Preenche todos os componentes da GUI a partir do objeto selecionado na
     * tabela
     */
    public void tabelaPreencheGUI() {

        try {
            int linha = frame.tabela.getSelectedRow();
            Integer cod;
            try {
                cod = (Integer) frame.tabela.getValueAt(linha, 0);
            } catch (IndexOutOfBoundsException er) {
                cod = 0;
                return;
            }

            List<Quadra> consulta = AbstractDAO.consultar(
                    "FROM Quadra q LEFT JOIN FETCH q.quadralogradouros ql LEFT JOIN FETCH ql.logradouro lg LEFT JOIN FETCH q.localidade lc LEFT JOIN FETCH lc.municipio WHERE q.idQuadra=" + cod + " order by q.codigo");
            this.setLogradouros.clear();

            if (consulta.size() > 0) {
                Quadra qua = consulta.get(0);
                frame.textId.setText(Integer.toString(qua.getIdQuadra()));
                frame.textCodigoMunicipio.setText(qua.getLocalidade().getMunicipio().getCodigo());
                frame.textNomeMunicipio.setText(qua.getLocalidade().getMunicipio().getNome());
                frame.textCodigoLocalidade.setText(qua.getLocalidade().getCodigo().toString());
                frame.textNomeLocalidade.setText(qua.getLocalidade().getNome());

                //Adiciona os logradouros da quadra ao HashSet de Logradouros
                for (Iterator it = qua.getQuadralogradouros().iterator(); it.hasNext();) {
                    this.setLogradouros.add(((Quadralogradouro) it.next()).getLogradouro());
                }
                this.setTabelaLogradouros();

                frame.textCodigo.setText(qua.getCodigo().toString());

                //Configura o comportamento dos botões da interface
                frame.buttonCadastro.setEnabled(false);
                EnabledGUIElements.enabledJComponent(frame.buttonAlterar, frame.textCodigoLocalidade, frame.buttonSelecionarLocalidade);
                this.guiAtiva(false);
                this.verificaAcessos();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Especificações do método em @InternalFrame
     */
    protected void listarTodosElementosNaTabela() {

        List<Quadra> list = AbstractDAO.listar("Quadra");
        listarPesquisaNaTabela(list);
    }

    /**
     * Especificações do método em @InternalFrame
     */
    private void listarPesquisaNaTabela(List<Quadra> list) {

        frame.tabela.getColumnModel().getColumn(0).setMinWidth(30);
        frame.tabela.getColumnModel().getColumn(1).setMinWidth(50);
        frame.tabela.getColumnModel().getColumn(2).setMinWidth(50);
        frame.tabela.getColumnModel().getColumn(3).setMinWidth(50);
        frame.tabela.getColumnModel().getColumn(4).setMinWidth(300);

        DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
        modelo.setNumRows(0);
        limparGUI();

        try {
            if (list != null) {
                for (int i = 0; i < list.size(); i++) {

                    Quadra qua = list.get(i);
                    modelo.addRow(new Object[]{qua.getIdQuadra(), qua.getCodigo(), qua.getLocalidade().getMunicipio().getCodigo(), qua.getLocalidade().getCodigo(),
                                qua.getLocalidade().getNome()});
                }
            }
        } catch (Exception er) {
            JOptionPane.showMessageDialog(frame, "Erro ao listar os objetos na tabela!\n\n" + er, "Erro na listagem!", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }

        //Permite o evento de ordernar a tabela a partir do click do mouse
        frame.tabela.setAutoCreateRowSorter(true);
    }

    /**
     * Instancia a quadra a partir dos elementos da interface gráfica
     *
     * @return
     */
    public Quadra criaQuadra(int opcao) {

        //Caso o usuário confirme o evento
        if (opcao == JOptionPane.YES_OPTION) {

            //Verifica se o numero da quadra está preenchido
            if (!frame.textCodigo.getText().trim().isEmpty()) {

                //Verifica se o código do município foi escrito
                if (!frame.textCodigoMunicipio.getText().trim().isEmpty()) {

                    //Verifica se o município existe
                    List<Municipio> listMun = this.getListMunicipio(frame.textCodigoMunicipio.getText());
                    if (listMun == null || listMun.size() == 0) {
                        return null;
                    }

                    //Instancia o município
                    Municipio mun = listMun.get(0);

                    //Verifica se a localidade existe
                    List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "codigo='" + frame.textCodigoLocalidade.getText().trim() + "' AND idMunicipio=" + mun.getIdMunicipio());
                    if (listLoc.isEmpty()) {
                        JOptionPane.showMessageDialog(frame, "Código de localidade inexistente para este município.", "Código de localidade inválido!", JOptionPane.WARNING_MESSAGE);
                        return null;
                    }

                    //Instancia as variáveis
                    Integer codigo = Integer.parseInt(frame.textCodigo.getText().trim());
                    Localidade loc = listLoc.get(0);
                    Integer id = null;

                    //Verifica o id da Quadra
                    if (!frame.textId.getText().trim().isEmpty()) {
                        id = Integer.parseInt(frame.textId.getText().trim());
                    } else {
                        id = AbstractDAO.max(Quadra.class, "idQuadra") + 1;
                    }

                    //Instancia o objeto
                    Quadra qua = new Quadra(loc, codigo);
                    qua.setIdQuadra(id);

                    //Verifica se já existe uma mesma quadra para esta localidade
                    if (this.verificaCodigoRepetido(qua, loc)) {
                        JOptionPane.showMessageDialog(frame, "Atenção! Já existe uma quadra com o mesmo código para esta localidade.", "Código repetido!", JOptionPane.WARNING_MESSAGE);
                        return null;
                    }

                    this.apagaQuadraLogradouro(qua);
                    //Armazena os logradouros da memória do frame no objeto da Quara atual
                    for (Iterator it = this.setLogradouros.iterator(); it.hasNext();) {
                        qua.getQuadralogradouros().add(new Quadralogradouro(qua, ((Logradouro) it.next())));
                    }

                    //Retorna o objeto
                    return qua;

                } else {
                    JOptionPane.showMessageDialog(frame, "Atenção! A localidade deve ser selecionada.", "Localidade não selecionada!", JOptionPane.WARNING_MESSAGE);
                }

            } else {
                JOptionPane.showMessageDialog(frame, "Atenção! O código da quadra deve ser preenchido.", "Número não preenchido!", JOptionPane.WARNING_MESSAGE);

            }
        }
        return null;

    }

    /**
     * Cadastra uma quadra através do frame
     */
    public void cadastrar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja cadastrar esta quadra ?", "Cadastro de localidade",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Quadra qua = this.criaQuadra(opcao);

        //Realiza o cadastro
        if (qua != null) {
            if (AbstractDAO.cadastrar(qua)) {
                JOptionPane.showMessageDialog(frame, "Quadra cadastrada com sucesso!", "Cadastro.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                int id = AbstractDAO.max(Quadra.class, "idQuadra");
                TransacaoDAO.cadastrar("Cadastrou a quadra id=" + id + ".");
            }
        }

    }

    /**
     * Altera uma quadra através do frame
     */
    public void alterar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja alterar a quadra ?", "Alteração de localidade",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Quadra qua = this.criaQuadra(opcao);

        //Realiza o cadastro
        if (qua != null) {
            if (AbstractDAO.alterar(qua)) {
                JOptionPane.showMessageDialog(frame, "Quadra alterada com sucesso!", "Alteração.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                TransacaoDAO.cadastrar("Alterou a quadra id=" + qua.getIdQuadra() + ".");
            }
        }

    }

    /**
     * Exclui uma quadra através do frame
     */
    public void excluir() {

        /*
         * Pergunta ao usuário se ele deseja realizar o cadastro
         */
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja excluir a quadra ?", "Exclusão.",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        /*
         * Captura o objeto no frame
         */
        Quadra qua = this.criaQuadra(opcao);

        /*
         * Realiza o cadastro
         */
        if (qua != null) {
            if (AbstractDAO.excluir(qua)) {
                JOptionPane.showMessageDialog(frame, "Quadra excluída com sucesso!", "Exclusão.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();
            }
        }

    }

    /**
     * Realiza a busca de um determinado objeto a partir dos parâmetros
     * definidos no @frame
     */
    public void buscar() {

        //Captura os parametros do frame
        String codigo = frame.textBuscaCodigo.getText();
        String codigoLocalidade = frame.textBuscaCodigoLocalidade.getText();
        String codigoMunicipio = frame.textBuscaCodigoMunicipio.getText();

        //Realiza a busca no bd
        List<Quadra> list = null;

        //Incrementa a string para consutar a busca
        String query = "";
        if (codigo != null && !codigo.trim().equals("")) {
            query += " q.codigo like '%" + codigo + "%' ";
        }
        if (codigoMunicipio != null && !codigoMunicipio.isEmpty()) {

            //Verifica se o código do município existe
            List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMunicipio + "'");
            if (listMun.size() > 0) {

                Municipio mun = listMun.get(0);

                //Incrementa a busca por localidade
                if (!codigoLocalidade.trim().isEmpty()) {

                    List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "idMunicipio=" + mun.getIdMunicipio() + " AND codigo='" + codigoLocalidade + "'");
                    if (!listLoc.isEmpty()) {
                        Localidade loc = listLoc.get(0);
                        if (query.length() > 1) {
                            query += " AND ";
                        }
                        query += " l.idLocalidade=" + loc.getIdLocalidade();

                    } else {
                        JOptionPane.showMessageDialog(frame, "Não existe nenhuma localidade deste município com este código.", "Código de localidade inexistente!",
                                JOptionPane.WARNING_MESSAGE);
                        return;
                    }
                } else {
                    JOptionPane.showMessageDialog(frame, "Por favor, selecione a localidade para realizar a busca.", "Selecione a localidade!",
                            JOptionPane.WARNING_MESSAGE);
                    return;
                }

            } else {
                JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                        JOptionPane.WARNING_MESSAGE);
                return;
            }

        }

        if (!query.equals("")) {
            list = (List<Quadra>) AbstractDAO.consultar("from Quadra q LEFT JOIN FETCH q.localidade l LEFT JOIN FETCH l.municipio m WHERE " + query);
        }

        //Lista os objetos encontrados na tabela
        if (list != null) {
            this.listarPesquisaNaTabela(list);
        } else {
            this.listarPesquisaNaTabela(null);
        }
    }

    /**
     * Limpa apenas os componentes de busca e lista a tabela de objetos com
     * todos os objetos do bd
     */
    public void limparBusca() {

        new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaNomeLocalidade, frame.textBuscaCodigo, frame.textBuscaCodigoMunicipio, frame.textBuscaNomeMunicipio, frame.textBuscaCodigoLocalidade);
        this.listarPesquisaNaTabela(null);
        EnabledGUIElements.disabledJComponent(frame.textBuscaNomeLocalidade, frame.textBuscaCodigoLocalidade, frame.buttonBuscaSelecionarLocalidade);

    }

    /**
     * Altera no bd os relacionamentos Quadralogradouro para esta Quadra
     */
    public Set<Quadralogradouro> apagaQuadraLogradouro(Quadra qua) {

        if (qua.getIdQuadra() != null) {
            List<Quadra> listQua = AbstractDAO.consultarSemFecharSessao("Quadra", "idQuadra=" + qua.getIdQuadra());
            if (!listQua.isEmpty()) {
                qua = listQua.get(0);
                for (Iterator it = qua.getQuadralogradouros().iterator(); it.hasNext();) {
                    Quadralogradouro ql = (Quadralogradouro) it.next();
                    AbstractDAO.excluir(ql);
                }

                qua.getQuadralogradouros().clear();
                AbstractDAO.fechaSessao();

                return qua.getQuadralogradouros();
            }

        }
        AbstractDAO.fechaSessao();
        return null;

    }

    /**
     * Evento de textCodigoLocalidade
     *
     * @return
     */
    public boolean eventoCodigoLocalidade() {

        //Verifica o município
        List<Municipio> listMunicipio = AbstractDAO.consultar("Municipio", "codigo='" + frame.textCodigoMunicipio.getText().trim() + "'");
        if (listMunicipio.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        //Captura a localidade
        String codigoLocalidade = frame.textCodigoLocalidade.getText().trim();

        //Pesquisa no bd pela localidade com este código
        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "codigo='" + codigoLocalidade + "' AND idMunicipio=" + listMunicipio.get(0).getIdMunicipio());
        if (listLoc.size() > 0) {
            //Insere o nome da localidade
            frame.textNomeLocalidade.setText(listLoc.get(0).getNome());

        } else {

            frame.textNomeLocalidade.setText("");
            JOptionPane.showMessageDialog(frame, "Não existe nenhuma localidade com este código para este município.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        return true;
    }

    /**
     * Verifica no Bd qual o próximo código de quadras para este município e
     * insere em textCodigo
     */
    public boolean getCodigoBd() {

        //Captura a localidade no Bd
        List<Municipio> listMun = this.getListMunicipio(frame.textCodigoMunicipio.getText());
        if (listMun != null) {
            List<Localidade> listLoc = this.getListLocalidade(frame.textCodigoLocalidade.getText(), listMun.get(0));

            if (listLoc != null) {
                List<Integer> list = AbstractDAO.consultar("select codigo from Quadra where idLocalidade=" + listLoc.get(0).getIdLocalidade());
                if (list.isEmpty()) {
                    frame.textCodigo.setText(1 + "");
                    return true;

                } else {
                    for (Integer index = 1; index < 999; index++) {
                        if (!list.contains(index)) {
                            frame.textCodigo.setText(index.toString());
                            return true;
                        }
                    }
                }
            }
        }

        frame.textCodigo.setText("");

        return false;
    }

    /**
     * Verifica se já existe uma quadra com o mesmo código para esta localidade
     *
     * @return
     */
    public boolean verificaCodigoRepetido(Quadra qua, Localidade loc) {

        //Captura no Bd as quadras com o mesmo código e mesma localidade
        List<Quadra> listQuadra = AbstractDAO.consultar("Quadra", "codigo='" + qua.getCodigo() + "' AND idLocalidade=" + loc.getIdLocalidade());
        if (!listQuadra.isEmpty()) {
            //Percorre a lista de quadras e verifica se alguma tem o id diferente da quadra atual
            for (int index = 0; index < listQuadra.size(); index++) {
                if (!qua.getIdQuadra().equals(listQuadra.get(0).getIdQuadra())) {
                    return true;
                }
            }
        }

        return false;
    }

    public boolean eventoTextCodigoMunicipio(JTextField textCodigoLocalidade, JButton buttonPesquisarLocalidade, JTextField textCodigoMunicipio,
            JTextField textNomeMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            EnabledGUIElements.enabledJComponent(textCodigoLocalidade);

            if (buttonPesquisarLocalidade != null) {
                EnabledGUIElements.enabledJComponent(buttonPesquisarLocalidade);
            }

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textCodigoLocalidade, textNomeMunicipio);

            EnabledGUIElements.disabledJComponent(textCodigoLocalidade);

            if (buttonPesquisarLocalidade != null) {
                EnabledGUIElements.disabledJComponent(buttonPesquisarLocalidade);
            }

            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        return true;
    }

    /**
     * Evento de textBuscaCodigoLocalidade
     *
     * @return
     */
    public boolean textCodigoLocalidade(JTextField textCodigoLocalidade, JTextField textNomeLocalidade, JTextField textCodigoMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();
        String codigoLoc = textCodigoLocalidade.getText().trim();

        //Verifica se o município existe
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        List<Localidade> list = AbstractDAO.consultar("Localidade", "codigo='" + codigoLoc + "' AND idMunicipio=" + listMun.get(0).getIdMunicipio());
        if (list.size() > 0) {
            textNomeLocalidade.setText(list.get(0).getNome());

        } else {
            textNomeLocalidade.setText("");
            JOptionPane.showMessageDialog(frame, "Não existe nenhuma localidade para este município com este código.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * Evento de comboMunicípio
     *
     * @return
     */
    public boolean comboMunicipio(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio) {

        //Preenche o código da localidade a partir do combobox de nomes 
        String codigoMun = textCodigoMunicipio.getText().trim();

        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (!codigoMun.isEmpty()) {
            if (list.isEmpty()) {
                return false;
            }
        } else {
            return false;
        }

        String nomeLoc = comboLocalidade.getSelectedItem().toString();
        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "nome='" + nomeLoc + "' AND idMunicipio=" + list.get(0).getIdMunicipio());
        if (listLoc.size() > 0) {
            textCodigoLocalidade.setText(listLoc.get(0).getCodigo().toString());
        } else {
            textCodigoLocalidade.setText("");
        }

        return true;
    }

    /**
     * Verifica se a tabela de logradouros já tem o número máximo permitido de
     * logradouros por quadra
     *
     * @return
     */
    public boolean verificaMaximoLogradouros() {

        if (frame.tabelaLogradouros.getModel().getRowCount() >= this.MAX_LOGRADOUROS) {
            frame.buttonInserir.setEnabled(false);
            JOptionPane.showMessageDialog(frame, "Esta quadra já tem o número máximo de logradouros permitidos.", "Atenção!",
                    JOptionPane.WARNING_MESSAGE);
            return true;
        }

        frame.buttonInserir.setEnabled(true);
        if (frame.tabelaLogradouros.getModel().getRowCount() == 0) {
            frame.buttonRemover.setEnabled(false);
        }

        return false;
    }

    /**
     * Preenche a tabela de logradouros de acordo com a quadra selecionada na
     * tabela principal
     */
    public void setTabelaLogradouros() {

        frame.tabelaLogradouros.getColumnModel().getColumn(0).setMinWidth(50);
        frame.tabelaLogradouros.getColumnModel().getColumn(1).setMinWidth(300);

        DefaultTableModel modelo = (DefaultTableModel) frame.tabelaLogradouros.getModel();
        modelo.setNumRows(0);

        //Verifica se existe algum logradouro para esta quadra
        if (this.setLogradouros != null && this.setLogradouros.size() > 0) {

            frame.buttonRemover.setEnabled(false);
            for (Iterator it = this.setLogradouros.iterator(); it.hasNext();) {

                //Verifica o tamanho máximo de logradouros por quadra
                Logradouro obj = ((Logradouro) it.next());
                modelo.addRow(new Object[]{obj.getIdLogradouro(), obj.getNome()});
                frame.buttonRemover.setEnabled(true);
            }
        }
    }

    /**
     * Abre o frame de busca para buscar e adicionar um novo logradouro
     *
     * @return
     */
    public boolean adicionarLogradouro() {

        if (!this.verificaMaximoLogradouros()) {

            //Captura as informações da quadra
            List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + frame.textCodigoMunicipio.getText() + "'");
            if (listMun.isEmpty()) {
                JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                        JOptionPane.WARNING_MESSAGE);
                return false;
            }

            //Focaliza o novo JInternalFrame
            IFBusca frameAdd = new IFBusca(this, Logradouro.class, IFQuadras.class, "idMunicipio=" + listMun.get(0).getIdMunicipio(), false);
            FramePrincipal.desktopPanel.add(frameAdd);
            FramePrincipal.desktopPanel.getDesktopManager().activateFrame(frameAdd);

            return true;

        }

        return false;

    }

    /**
     * Remove o logradouro selecionado na tabela de logradouros
     *
     * @return
     */
    public boolean removerLogradouro() {

        //Captura o modelo da tabela
        DefaultTableModel modelo = (DefaultTableModel) frame.tabelaLogradouros.getModel();

        //Verifica se existe pelo menos uma linha no modelo
        if (modelo.getRowCount() > 0) {

            //Captura a linha selecionada
            int linha = frame.tabelaLogradouros.getSelectedRow();

            //Verifica se a linha capturada existe
            if (linha != -1) {
                int opcao = JOptionPane.showOptionDialog(frame, "Você tem certeza que deseja remover o logradouro selecionado na tabela?", "Remoção de logradouro",
                        JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                        frame.botoesOpcoes, frame.botoesOpcoes[0]);

                if (opcao == JOptionPane.YES_OPTION) {
                    //Remove do HashSet de Logradouros, o logradouro correspondente
                    List<Municipio> listMun = this.getListMunicipio(frame.textCodigoMunicipio.getText());
                    List<Logradouro> listLog = this.getListLogradouro(modelo.getValueAt(linha, 0).toString());
                    if (listMun != null) {

                        this.setLogradouros.remove(listLog.get(0));

                        //Remove a linha capturada
                        modelo.removeRow(linha);
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null, "Você não escolheu nenhuma linha da tabela de logradouros para ser removida.", "Atenção", JOptionPane.ERROR_MESSAGE);
            }
        }

        return false;
    }

    /**
     * Insere na Gui a localidade buscada
     */
    public boolean setGuiLocalidade(Localidade loc) {

        if (loc != null) {
            frame.textCodigoLocalidade.setText(loc.getCodigo().toString());
            frame.textNomeLocalidade.setText(loc.getNome());
            getCodigoBd();

            return true;
        }

        return false;
    }

    public boolean setGuiLocalidadeBusca(Localidade loc) {

        if (loc != null) {
            frame.textBuscaCodigoLocalidade.setText(loc.getCodigo().toString());
            frame.textBuscaNomeLocalidade.setText(loc.getNome());

            return true;
        }

        return false;
    }
}
